/**************************************************************************//**
 * @item     CosyOS Kernel
 * @file     sv_tick.h
 * @brief    滴答服务（仅在滴答钩子、定时中断钩子、定时查询钩子中调用）
 * @author   迟凯峰
 * @version  V3.3.1
 * @date     2023.07.26
 ******************************************************************************/

#ifndef __SV_TICK_H
#define __SV_TICK_H

extern tECODE resume_task__ (tspTaskNode task_node);
extern tECODE suspend_task__(tspTaskNode task_node);
extern tECODE delete_task__ (tspTaskNode task_node);
extern tECODE set_priority__(tspTaskNode task_node, u8 tpl);
extern bool   set_delay__   (tspTaskNode task_node, tDelay tc);
extern bool   clr_delay__   (tspTaskNode task_node);
extern bool   take_sem__    (tSemSize _XDATA_MEM_ *c);
extern void   free_sem__    (tspSem p);
extern tFetion recv_fetion__(tFetion _XDATA_MEM_ *tbox);
extern void   send_mail__   (void _XDATA_MEM_ *gm, void *lm, size_t size, bool _XDATA_MEM_ *gf);
extern tECODE send_msg__    (tspMsgQueue msg_queue, void *msg);
extern void * recv_msg__    (tspMsgQueue msg_queue);
extern void   write_gvar__  (void *gp, void *lp, size_t size);
extern void   sope_gvar__   (void *gp, void *lp, tfpVV fp);



/*
 * 任务
 */

/* 恢复指定任务 */
#define	sTSV_ResumeTask(node)	\
	resume_task__(node)

/* 挂起指定任务 */
#define	sTSV_SuspendTask(node)	\
	suspend_task__(node)

/* 删除指定任务 */
#define	sTSV_DeleteTask(node)	\
	delete_task__(node)

/* 设置任务优先级 */
#define	sTSV_SetPriority(node, tpl)	\
	set_priority__(node, tpl)



/*
 * 延时
 */

/* 设置延时 */
#define	sTSV_SetDelay(node, tc)	\
	set_delay__(node, tc)

/* 清除延时 */
#define	sTSV_ClearDelay(node)	\
	clr_delay__(node)



/*
 * 定时
 */

/* 定时中断 */
#define	sTSV_TimInt(tmid, tc)	\
	vTIMINT_STMR[tmid] = vTIMINT_BUFF[tmid] = tc

/* 定时查询 */
#define	sTSV_TimQry(tmid, tc)	\
	vTIMQRY_STMR[tmid] = vTIMQRY_BUFF[tmid] = tc



/*
 * 二值信号量
 */

/* 获取 */
#define sTSV_TakeBin(bin)	\
(	\
	bin ? bin-- : bin	\
)



/*
 * 计数信号量
 */

/* 获取 */
#define sTSV_TakeSem(sem)	\
	take_sem__(&sem.counter)

/* 释放 */
#define sTSV_FreeSem(sem)	\
	free_sem__(&sem)



/*
 * 飞信
 */

/* 接收飞信 */
#define sTSV_RecvFetion(tbox)	\
(	\
	tbox ? recv_fetion__(&tbox) : false	\
)



/*
 * 私信
 */

/* 发送私信 */
#if SYSCFG_COMPILEMODE == __C89__
	#define	sTSV_SendDM(task)	\
		vSendDM_f = true;	\
		__DM_PSP__;	\
		task(__DM_VAL__, 
#elif SYSCFG_COMPILEMODE == __C99__
	#define sTSV_SendDM(task, ...)	\
	do{	\
		vSendDM_f = true;	\
		__DM_PSP__;	\
		task(__DM_VAL__, __VA_ARGS__);	\
	}while(false)
#endif



/*
 * 消息邮箱
 */

/* 接收邮件 */
#define sTSV_RecvMail(mail, mbox)	\
(	\
	mbox##_gnmf	\
	? __memcpy(mail, &mbox, sizeof(mbox)) || true	\
		? mbox##_gnmf--	\
		: mbox##_gnmf--	\
	: false	\
)

/* 发送邮件 */
#define sTSV_SendMail(mbox, mail)	\
	send_mail__(&mbox, mail, sizeof(mbox), (bool *)&mbox##_gnmf)



/*
 * 消息队列
 */

/* 发送消息 */
#define	sTSV_SendMsg(que, msg)	\
	send_msg__(que, msg)

/* 接收消息 */
#define	sTSV_RecvMsg(que)	\
	recv_msg__(que)



/*
 * 事件标志组
 */

/* 查询标志组 */
#define	sTSV_QueryFlagGroup(group)	\
(	\
	  sizeof(group) == 1 ? *(u8  *)&group ? true : false	\
	: sizeof(group) == 2 ? *(u16 *)&group ? true : false	\
	: sizeof(group) == 4 ? *(u32 *)&group ? true : false	\
	: false	\
)

/* 清除标志组 */
#define sTSV_ClearFlagGroup(group)	\
do{	\
	sizeof(group) == 1 ? *(u8  *)&group = false : OS_NOPx1;	\
	sizeof(group) == 2 ? *(u16 *)&group = false : OS_NOPx1;	\
	sizeof(group) == 4 ? *(u32 *)&group = false : OS_NOPx1;	\
}while(false)



/*
 * 全局变量
 */

/* 全局变量写访问 */
#define sTSV_WriteGVar(gp, lp, size)	\
	write_gvar__(gp, lp, size)

/* 全局变量自运算 */
#define sTSV_SelfOpe(gv, type, fp)	\
do{	\
	static type lv;	\
	lv = gv;	\
	sope_gvar__(&gv, &lv, fp);	\
}while(false)



#endif
